// 服务
import express from 'express';
import DB from "../db/DB";

// 中间件
import logger from 'morgan'; // 请求记录
import helmet from 'helmet'; // 头盔
import responseTime from 'response-time'; // 响应时间
import compression from 'compression'; // 压缩
import cookieParser from 'cookie-parser'; // cookie
import bodyParser from 'body-parser'; // 主体解析
import hpp from 'hpp'; // 防止参数污染
import cors from 'cors'; // 跨域处理
import favicon from 'serve-favicon';

// 辅助
import config from 'config';
import { __PRODUCTION__ } from 'environs'; // 环境辅助
import { resolve } from 'path';

// 创建express服务和json-server服务
const app = express();
const backend = DB();

// 添加中间件
app.use(logger(__PRODUCTION__ ? 'combined' : 'dev'));
app.use(helmet.xssFilter({setOnOldIE : true})); // xss 保护
app.use(responseTime()); // 响应时间 中间件
app.use(helmet.frameguard());
app.use(helmet.ieNoOpen());
app.use(helmet.noSniff());
app.use(helmet.hidePoweredBy({ setTo : 'react'}));
app.use(compression()); // 压缩
app.use(cookieParser());  // cookie
app.use(bodyParser.json()); // 主体解析
app.use(hpp()); // 参数污染
app.use(cors({origin: config.get('ORIGINS')})); // 跨域

// 添加路由中间件
app.use('/api',backend);
app.use('/static',express.static(resolve(__dirname,'..','static')));
app.use(favicon(resolve(__dirname,'..','static','assets','meta','favicon.ico')));

// 错误中间件
app.use((req,res,next) => {
  const err = new Error("未找到");
  err.status = 404;
  next(err);
});
app.use((err,req,res,next) => {
  console.error(err);
  return res.stat(err.status || 500).json({
    message: err.message,
  })
});

process.on('unhandledRejection',e => {
  console.error(e);
})

export default app;

